FROM golang:alpine AS builder
# 设置镜像必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64
# 移动到工作目录 /build
WORKDIR /build

# 将代码复制到容器
COPY . .

# 生成go mod 避免找不到main moudle
RUN go mod init build
# go mod tidy 校验
RUN go mod tidy
# 将我们的代码编译成二进制可执行文件 app
RUN go build -o app .

##################
# 接下来创建一个小镜像
##################
FROM scratch

# 从builder 镜像中把/dist/app 拷贝到当前目录
COPY --from=builder /build/app /

# 需要运行的命令
ENTRYPOINT [ "/app" ]

# 使用这种技术，我们剥离了使用golang:alpine作为编译镜像来编译得到二进制可执行文件的过程，
# 并基于scratch生成一个简单的、非常小的新镜像。
# 我们将二进制文件从命名为builder的第一个镜像中复制到新创建的scratch镜像中。
# 有关scratch镜像的更多信息，请查看https://hub.docker.com/_/scratch